package cn.song.config.convert;

import cn.song.annotation.EasyExcel;
import cn.song.constants.BaseEnum;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * EasyExcel 通用枚举转换器
 *
 * @author SongRenShuo
 * @date 2025/01/06
 */
@Slf4j
public class EasyExcelEnumConverter implements Converter<Integer> {
    /**
     * 支持 Java Type Key
     *
     * @return {@link Class }<{@link ? }>
     * @date 2025/01/20
     * @author SongRenShuo
     */
    @Override
    public Class<?> supportJavaTypeKey() {
        // 指定转换器接收参数类型
        return Integer.class;
    }

    /**
     * 支持 Excel 键入键
     *
     * @return {@link CellDataTypeEnum }
     * @date 2025/01/20
     * @author SongRenShuo
     */
    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        // 指定返回的参数类型
        return CellDataTypeEnum.STRING;
    }

    /**
     * 转换为 Java 数据
     *
     * @param cellData            单元格数据
     * @param contentProperty     content 属性
     * @param globalConfiguration 全局配置
     * @return {@link Integer }
     * @date 2025/01/20
     * @author SongRenShuo
     */
    @Override
    public Integer convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
        // 导入的时候直接导入数字即可 不用操作
        try {
            return cellData.getOriginalNumberValue().intValue();
        } catch (NumberFormatException e) {
            log.error("Excel 通用枚举转换器 转换失败,当前值：{}",cellData.getOriginalNumberValue(), e);
            return null;
        }
    }

    /**
     * 转换为 Excel 数据
     *
     * @param value               价值
     * @param contentProperty     content 属性
     * @param globalConfiguration 全局配置
     * @return {@link WriteCellData }<{@link ? }>
     * @date 2025/01/20
     * @author SongRenShuo
     */
    @Override
    public WriteCellData<?> convertToExcelData(Integer value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
        // value:状态码  contentProperty：字段属性  globalConfiguration：全局配置
        // 获取字段属性中的注解
        Field field = contentProperty.getField();
        // 获取该字段所属枚举
        EasyExcel easyExcel = field.getAnnotation(EasyExcel.class);
        // 获取注解中的枚举信息
        Class<? extends BaseEnum> type = easyExcel.type();
        // 获取枚举类的方法名 “codeOf”就是自己编写的函数，Integer.class 指定入参类型
        Method codeOf = type.getMethod("valueOf", Integer.class);
        // 反射执行方法，此方法得到的是一个枚举实例（具体得到什么，结合自身项目）
        Object invoke = codeOf.invoke(type, value);
        // 枚举实例调用getName方法，得到name的值
        Method getName = invoke.getClass().getMethod("getName");
        String name = String.valueOf(getName.invoke(invoke));
        // 将转换的值进行返回
        return new WriteCellData<>(name);
    }
}
